#ifndef RLS_PTABLE_H
#define RLS_PTABLE_H

#include "ns3/timer.h"
#include "ns3/vector.h"
#include "ns3/ipv4.h"
#include <map>

namespace ns3{

//Representa cada entrada da tabela
class MapEntry{

public:

	MapEntry(Vector position, Time time, bool researchFlag, uint8_t numSeq);

	//Altera o campo posiçao numa entrada
	void SetPosition(Vector position) { m_position = position; }
	//Altera o campo tempo numa entrada
	void SetSpeed(int speed) { m_speed = speed; }

	
	//Obtem os valores dos campos anteriormente referidos
	Vector GetPosition() { return m_position; }
	int GetSpeed() { return m_speed; }

	

private:

	Vector m_position;
	int m_speed; //When m_researchFlag true this is the time when the research starts

};

class PositionTable{
public:

	PositionTable(Time Lifetime) : m_entryLifeTime (m_entryLifeTime) {}
	
	/* O seguinte conjunto de funções permite que tendo acesso ao mapa
	 * possa os valores de cada entrada sem ter que aceder ao 2º membro
	 * do mapa 
	 */

	Vector GetPosition(Ipv4Address id, Vector invVec);
	void SetPosition(Ipv4Address id, Vector position);
	void SetSpeed(Ipv4Address id,int speed);
	Time GetSpeed(Ipv4Address id);
	
	/* Permite adicionar entradas à tabela tem alguns valores por omissão
	 * pois quando o protocolo de Routing pede para adicionar algo nao 
	 * conhecimentos desses valores, bastando mandar os dois primeiros.
	 * Por outro lado o rls-search-protocol pode querer alterar esses 
	 * valores logo quando adiciona um entrada.
	 */
	void AddEntry(Ipv4Address id, Vector position, Time time = Time(0), bool flag = false, uint8_t seq = 0);
	void DeleteEntry(Ipv4Address id);
	
	void Purge();
	void Clear();
private:
	Time m_entryLifeTime;
	std::map<Ipv4Address, MapEntry> m_table;

}; 
} 
#endif /* RLS_PTABLE_H */
